package com.kaifamiao.tags;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

public class IteratorTag extends SimpleTagSupport {

    private Object items ;
    private String var ;

    @Override
    public void doTag() throws JspException, IOException {

        // 应该检查 items 和 var 是否为 null

        JspContext ctx = this.getJspContext();
        // 获取标签体(即两个标签中间夹的内容)
        JspFragment body = this.getJspBody();
        System.out.println( "标签体: " + body );

        // 当 items 不为空时通过 items 对应的 类来判断是否是数组
        if( items.getClass().isArray() ){
            // 通过 java.lang.reflect.Array 获取数组长度
            final int length = Array.getLength( items );
            for (int i = 0; i < length ; i++) {
                // 通过 java.lang.reflect.Array 获取数组中指定位置的元素
                Object e = Array.get( items , i );
                // 将 e 作为值设置到 JspContext 中
                ctx.setAttribute( this.var , e );
                // 处理标签体
                body.invoke( null );
            }
        }

        if( items instanceof  Map map ){
            items = map.entrySet();
        }

        // 这个判断中用于处理 List 、Set 、Queue 等类型的集合
        if( items instanceof Collection c ) {

        }

    }

    public Object getItems() {
        return items;
    }

    public void setItems(Object items) {
        this.items = items;
    }

    public String getVar() {
        return var;
    }

    public void setVar(String var) {
        this.var = var;
    }
}
